3.4.3 Debug get文
Debug get文はPDM、DRAM、L2BM、L1BM、GRF0/1、LM0/1、Tレジスタの内容を出力するエミュレータ実行時専用の制御文である。
実機で実行することはできない。
エミュレータはサイクルアキュレートではなく、任意の命令は発行後即時完了することに注意する。
言い換えるならDebug get文は直前で十分なサイクル数を待ってからメモリを読んだのと同等の結果になる。
code:文法
d get<dtype> <memory>n<group_id>c<l2b_id>b<l1b_id>m<mab_id>p<pe_id> <num_of_words>
ここで<dtype>と<memory>は以下であり、それ以外は自然数である。
code:txt
<dtype> ::= d|f|h
<memory> ::= $p<addr>
|$d<addr>
|$lc<addr>
|$(l|ll)b<addr>
|$(l|ll)(r|s|m|n)<addr>
|$(l|ll)t
効果
指定したメモリ要素・アドレスのデータをエミュレータ実行時に指定した出力ファイルにダンプする。
その際浮動小数点数としての解釈が付加される。
以下、構文の各要素の効果を順に解説する。
dtypeはデータをどの数値フォーマットで解釈するかを指定する。
どの指定でも浮動小数点数と整数の両方で解釈した結果が出力される。
各指定で選択される数値フォーマットを表 3.1に示す。
table:表 3.1 Debug get文のデータフォーマット解釈指定
<dtype> 浮動小数点数 整数
無指定 倍精度 半語および長語
d 倍精度 長語
f 単精度 単語
h 半精度 半語
<memory>の<addr>以前の部分はメモリ要素の種類と語長の指定である。
可能な組み合わせを表 3.2に列挙する。
これは実際のMV命令文やPE命令文のオペランドで指定可能な組み合わせと同じである。
Tレジスタについて、実際の命令では常に 2 長語アクセスだが、Debug get文では$tまたは$ltの記述により長語アクセスが可能である。
$tと書いても単語アクセスにはならないことに注意する。
table:表 3.2 Debug get文で読み出し可能なメモリ要素と語長の組み合わせ
<memory> メモリ要素 語長
$p PDM 長語
$d DRAM 長語
$lc L2BM 長語
$lb L1BM 長語
$llb L1BM 2長語
$r,$s,$m,$n GRF0/GRF1/LM0/LM1 単語
$lr,$ls,$lm,$ln GRF0/GRF1/LM0/LM1 長語
$llr,$lls,$llm,$lln GRF0/GRF1/LM0/LM1 2長語
$t,$lt Tレジスタ 長語
$llt Tレジスタ 2長語
メモリ
<addr>はアドレスを指定する。
単位はGRF0、GRF1、LM0、LM1では単語、PDM、DRAM、L2BM、L1BMでは長語である。
これも実際のMV命令文やPE命令文のオペランドのルールに従っている。
Tレジスタについてはアドレス指定がなく、常に先頭、すなわち第 1 サイクルでアクセスされるエントリから読み出しが開始される。
[n<group_id>][c<l2b_id>][b<l1b_id>][m<mab_id>][p<pe_id>]は順に、グループ、L2B、L1B、MAB、PEの階層について、出力する対象のメモリ要素番号を限定する。
文法の都合上、cやbの指定を行う場合は、nの指定が行われていなければならない。
指定しなかった場合、その階層の全ての要素が対象となる。
例えばn0b1m2とした場合、0番グループ、 1 番L1B、 2 番MAB以外の値は表示されない。
対象のメモリより下の階層の指定、例えばPDM出力時のc<l2b_id>指定などは無視される。
<num_of_words>はで指定した語長を単位としてから何語を読み出すかを 10 進数で指定する。
Tレジスタにおいては、これを 1 から 4 の範囲で指定することで第 1 サイクルから始めて複数サイクル分を読み出せる。
<memory>を$lt、<num_of_words>を 2 としたときに 2 語目として読み出されるのは、第 1サイクル分のLSB側 1 長語ではなく、第 2 サイクル分のMSB側 1 長語であることに注意する。
エラー
<memory>による読み出し語長指定が<dtype>によるデータフォーマット解釈指定より短いと、その精度での解釈ができないのでエラーとなる
code:例 1
imm h"1.5" $ln0
d geth $ln0n0c0b0m0p0 1
LM1に書き込んだ半精度の1.5が 4 つ並んだ長語を、指定した1PEについて読み出す。
半精度が16bit, 長語が64bitだから4つ並ぶということかなwogikaze.icon
code:出力(py)
DEBUG-LM1(n0c0b0m0p0,0):(1.5, 1.5, 1.5, 1.5) (0x3f00, 0x3f00, 0x3f00, 0x3f00) #d geth $ln0n0c0b0m0p0 1
code:例 2
lpassa $l1bid $lr0
d get $lr0n0c0m0p0 1
GRF0に書き込んだ長語整数のL1B番号を、L1Bごとに1PE、すなわち計8PEについて読み出す。<dtype>が無指定なので、f:に倍精度浮動小数点数、i:に半語整数、v:に長語整数としての解釈がそれぞれ表示されている。
code:出力(py)
DEBUG-GREG0(n0c0b0m0p0,0):(f:0,i:{{0x0,0x0},{0x0,0x0}},v:0x0) #d get $lr0n0c0m0p0 1
DEBUG-GREG0(n0c0b1m0p0,0):(f:0,i:{{0x0,0x0},{0x0,0x1}},v:0x1) #d get $lr0n0c0m0p0 1
DEBUG-GREG0(n0c0b2m0p0,0):(f:0,i:{{0x0,0x0},{0x0,0x2}},v:0x2) #d get $lr0n0c0m0p0 1
DEBUG-GREG0(n0c0b3m0p0,0):(f:0,i:{{0x0,0x0},{0x0,0x3}},v:0x3) #d get $lr0n0c0m0p0 1
DEBUG-GREG0(n0c0b4m0p0,0):(f:0,i:{{0x0,0x0},{0x0,0x4}},v:0x4) #d get $lr0n0c0m0p0 1
DEBUG-GREG0(n0c0b5m0p0,0):(f:0,i:{{0x0,0x0},{0x0,0x5}},v:0x5) #d get $lr0n0c0m0p0 1
DEBUG-GREG0(n0c0b6m0p0,0):(f:0,i:{{0x0,0x0},{0x0,0x6}},v:0x6) #d get $lr0n0c0m0p0 1
DEBUG-GREG0(n0c0b7m0p0,0):(f:0,i:{{0x0,0x0},{0x0,0x7}},v:0x7) #d get $lr0n0c0m0p0 1